7.3.3 Consultas Avanzadas y Agregación
En el mundo real, los datos no son útiles si no podemos extraer conclusiones de ellos. No basta con saber qué libros hay; necesitamos saber cuántos son de cierto autor, cuál es el más caro o filtrar aquellos que empiezan por una letra específica.
Aquí es donde el SQL brilla como un lenguaje de "declaración de intenciones": tú le dices qué quieres, no cómo encontrarlo.
1️⃣ El Arte de Filtrar: Más allá del =
Cuando buscamos datos, a veces no conocemos el valor exacto o buscamos un rango.
🟩 Patrones con LIKE
Permite buscar dentro de cadenas de texto usando comodines:
%➡️ Sustituye a cualquier número de caracteres (incluso ninguno)._➡️ Sustituye a exactamente un carácter.
-- Libros que empiezan por 'El'
SELECT * FROM libros WHERE titulo LIKE 'El%';
-- Libros que tienen 'an' en cualquier posición
SELECT * FROM libros WHERE autor LIKE '%an%';
🟦 Rangos y Listas (BETWEEN, IN, DISTINCT)
BETWEEN: Filtra dentro de un rango inclusivo.IN: Verifica si el valor está en una lista específica.DISTINCT: Elimina duplicados del resultado.
-- Libros de entre 200 y 500 páginas
SELECT * FROM libros WHERE paginas BETWEEN 200 AND 500;
-- Libros de autores específicos
SELECT * FROM libros WHERE autor IN ('Isaac Asimov', 'George Orwell');
-- Listado de todos los autores (sin repetir)
SELECT DISTINCT autor FROM libros;
2️⃣ Funciones de Agregado y Agrupación
Las funciones de agregado procesan un conjunto de filas para devolver un único valor de resumen.
🟩 Las 5 Funciones Maestras
COUNT(): Cuenta registros.SUM(): Suma valores numéricos.AVG(): Calcula el promedio.MAX()/MIN(): Encuentra el valor máximo o mínimo.
SELECT COUNT(*) AS total_libros, AVG(paginas) AS promedio_paginas FROM libros;
🟦 GROUP BY y HAVING
Si queremos el resumen por cada autor, usamos GROUP BY. Si queremos filtrar esos grupos, usamos HAVING (el WHERE de los grupos).
-- Contar libros por cada autor
SELECT autor, COUNT(*) AS cantidad
FROM libros
GROUP BY autor;
-- Solo autores que tengan más de 5 libros registrados
SELECT autor, COUNT(*) AS cantidad
FROM libros
GROUP BY autor
HAVING cantidad > 5;
3️⃣ Orden, Límite y Paginación
Controlar cómo y cuántos datos recibimos es vital para el rendimiento y la experiencia de usuario.
🟩 ORDER BY (Ordenación)
-- Libros ordenados por páginas de mayor a menor
SELECT * FROM libros ORDER BY paginas DESC;
🟦 LIMIT y OFFSET (Paginación)
Esto es lo que usan las webs para mostrar resultados "página 1, página 2...".
LIMIT 10: Trae solo los 10 primeros.OFFSET 10: Salta los 10 primeros.
# Traer la segunda página de resultados (resultados del 11 al 20)
cursor.execute("SELECT * FROM libros LIMIT 10 OFFSET 10")
4️⃣ Alias y Subconsultas
A veces necesitamos usar el resultado de una consulta dentro de otra.
🟩 Alias (AS)
Sirve para dar nombres temporales y legibles a columnas calculadas o tablas.
SELECT titulo, (paginas / 10) AS tiempo_estimado_lectura FROM libros;
🟦 Subconsultas
¿Y si quieres buscar los libros que tienen más páginas que la media? No puedes poner AVG() en un WHERE directamente. Necesitas una subconsulta:
SELECT titulo, paginas
FROM libros
WHERE paginas > (SELECT AVG(paginas) FROM libros);
✅ Buenas prácticas en Consultas
- Evita el
SELECT *: En aplicaciones grandes, pide solo las columnas que vas a usar. Ahorra ancho de banda y memoria. - Alias claros: Usa
ASpara que tus resultados tengan nombres que se entiendan al leer el código Python. - Usa
LIMIT: Si vas a mostrar datos en una UI, nunca traigas 10,000 filas de golpe. - Cuidado con
LIKE: Las búsquedas que empiezan por%(ej:%texto) son lentas porque SQLite no puede usar índices para encontrarlas.
🧪 Ejercicios prácticos – Misión: La Cripta de Datos (Parte 3)
El archivo histórico de la Cripta de Datos está creciendo. El bibliotecario jefe te pide realizar un análisis estadístico para entender "el peso del conocimiento".
🟢 Fase 1 – Búsqueda de Patrones
🟩 Ejercicio 1 – Los Manuscritos Perdidos
Busca todos los libros cuyo título contenga la palabra "El" o "La" (puedes usar varios LIKE u operadores OR). Muestra el resultado ordenado alfabéticamente por título.
🟦 Ejercicio 2 – La Zona de Estudio
Muestra únicamente el título y el autor de los libros que tengan entre 300 y 600 páginas, pero salta el primer resultado encontrado (usa OFFSET).
🟡 Fase 2 – El Resumen del Sabio
🟨 Ejercicio 3 – Estadística de Autores
Calcula y muestra por pantalla:
- El número total de autores distintos que hay en la cripta.
- Cuántos libros hay en total.
- El promedio de páginas de todos los libros (redondeado a 2 decimales).
🟧 Ejercicio 4 – Rankings de Autoría
Muestra una lista de autores junto con la cantidad de libros que tienen cada uno, ordenados de quien tiene más libros a quien tiene menos. Solo deben aparecer autores que tengan más de 1 libro.
🔴 Fase 3 – Consultas de Élite
🟥 Ejercicio 5 – El Libro que destaca
Utilizando una subconsulta, encuentra y muestra el título del libro (o libros) que tienen un número de páginas superior al promedio de toda la biblioteca.
🟪 Ejercicio 6 – Paginación Real
Simula un sistema de páginas para la consola:
- Pregunta al usuario qué página quiere ver (ej: Página 1).
- Muestra los libros de 3 en 3 (Página 1: 1-3, Página 2: 4-6...).
- Implementa la lógica usando
LIMITy una fórmula matemática para elOFFSETbasada en la página introducida por el usuario. (Fórmula: OFFSET = (pagina - 1) * limite)